Option base 1:Mode 4:md=1:fr=1:enemy=20
LoadBMP "game":Sprite Load "maxitrek.spr":SetTick 10,engine
Dim starx(10),stary(10),starz(10),ox(10),oy(10),map(8,8),cndt$(3),maph(8,8)
cndt$(2)=CLR$(4,6)+"   RED   ":cndt$(1)=CLR$(6,2)+"  GREEN  "
cndt$(3)=CLR$(1,3)+" DOCKED  ":Sprite on 7,240,85
Sprite on 1,1,220,0:Sprite on 2,1,220,0:Sprite on 3,1,220,0
Sprite on 4,1,220,0:Sprite on 5,1,220,0:Sprite on 6,1,220,0
energy=100:shields=0:damage=0:dock=0:enpr=0:endam=0:enty=0:lr=1:sh=1:nv=1:mp=1
For t=1 To 8:For e=1 To 8
  maph(t,e)=0
Next e,t
For e=1 To enemy
  rifai:
  ex=Cint(Rnd(1)*7)+1:ey=Cint(Rnd(1)*7)+1
  If map(ex,ey)>0 Or ex+ey=2 Then GoTo rifai
  map(ex,ey)=1
Next e
rifai2:
px=Cint(Rnd(1)*7)+1:py=Cint(Rnd(1)*7)+1
If map(px,py)>0 Or px+py=2 Then GoTo rifai2
map(px,py)=2
map(1,1)=0:px=1:py=1
Print @(20,8)CLR$(7)"ENERGY: "CLR$(2)" "energy"%"CLR$(7)@(160,8)"CONDITION"
Print @(20,21)CLR$(7)"SHIELDS:"CLR$(2)" "shields"%"@(160,20)cndt$(1)
std=0
Do
a$=Inkey$:If a$="" Then GoTo ggiu
If a$="m" Then GoSub showmap:If dock=1 Then GoSub showdock
If a$="l" Then GoSub longrange
If a$="d" Then GoSub damage
'If a$="c" Then energy=999:damage=0:lr=1:mp=1:sh=1:nv=1:shields=999
If a$="j" Then GoSub hyperjump:If dock=1 Then GoSub showdock
If a$="b" Then GoSub battlepc:If dock=1 Then GoSub showdock
If enpr=1 Then
  Sprite move 7,cx,cy,0
  If Asc(a$)=128 Then cy=cy-1:If cy<45 Then cy=45
  If Asc(a$)=129 Then cy=cy+1:If cy>125 Then cy=125
  If Asc(a$)=130 Then cx=cx-1:If cx<10 Then cx=10
  If Asc(a$)=131 Then cx=cx+1:If cx>215 Then cx=215
  If Asc(a$)=139 And fr=1 Then GoSub fire
EndIf
ggiu:
t=t+1:fr=fr-1:If fr<1Then fr=1
If t=10 And dock=0 Then t=0:GoSub starfield:If enpr=1 Then GoSub updenemy
If dock=1 Then
  damage=0:energy=100:sh=1:nv=1:lr=1:mp=1:Print @(74,8)CLR$(2)energy"% "
EndIf
If std=>9999 Or energy<=0 Or damage=>100 Then GoTo badend
Loop

fire:
Line(2,144)-(cx+8,cy+8),3:Line(237,144)-(cx+8,cy+8),3
dur=100:dt=50:energy=energy-1:SetTick 5,laser:Pause 250
Line(2,144)-(cx+8,cy+8),0:Line(237,144)-(cx+8,cy+8),0
If cx-ex<=3 And cx-ex=>-3 Then
  If cy-ey<=3 And cy-ey=>-3 Then dur=100:SetTick 5,boom:GoSub enemyhit
EndIf
fr=150
Return

enemyhit:
endam=Int(endam+(20-(enty*2.5))):If endam>100 Then endam=100
Print@(203,190)CLR$(5)endam"%"@(74,8)CLR$(2)energy"% "
If endam=100 Then
  enpr=0:map(px,py)=0:enemy=enemy-1:dur=100:SetTick 10,boom
  Sprite move 7,1,220,0
  Sprite move enty,1,220,0:Sprite on 8,ex,ey,0:Pause 300
  Sprite off 8:Sprite on 9,ex,ey,0:Pause 300
  Sprite off 9:Sprite on 10,ex,ey,0:Pause 300:Sprite off 10
  Line(203,190)-(232,202),0,bf
  Print @(160,20)cndt$(enpr+1)
  If enemy=0 Then Line(100,100)-(100,100),0,bf:Print @(80,180)"Return to base"
EndIf
Return

updenemy:
mm=Int(Rnd(1)*20)+1:If mm>4 Then Return
If mm=1 Then ey=ey-2:If ey<45 Then ey=45
If mm=2 Then ey=ey+2:If ey>125 Then ey=125
If mm=3 Then ex=ex-2:If ex<10 Then ex=10
If mm=4 Then ex=ex+2:If ex>215 Then ex=215
Sprite move enty,ex,ey,0:Pause 100
mm=Int(Rnd(1)*40)+1:If mm>39 Then GoSub enfire
Return

enfire:
Line(ex+8,ey+8)-(112,144),4
dur=100:dt=50:SetTick 1,enemy:Pause 250
Line(ex+8,ey+8)-(112,144),0
If shields=>5 Then shields=shields-5:dur=100:SetTick 5,shield
If shields<5 Then damage=damage+5:dur=100:SetTick 5,boom:GoSub damage
If damage=>20 Then lr=0
If damage=>40 Then mp=0
If damage=>60 Then nv=0
If damage=>80 Then sh=0
Print @(74,8)CLR$(2)energy"% ":Print @(74,21)CLR$(2)shields"% "
Return

initenemy:
enty=Int(Rnd(1)*5)+1:If enemy=1 Then enty=6
ex=30+Int(Rnd(1)*130):ey=60+Int(Rnd(1)*70):endam=0
Sprite move enty,ex,ey,0:Print@(203,190)CLR$(5)endam"%"
Return

battlepc:
Line(60,167)-(179,204),0,bf:Line(2,40)-(237,144),0,bf
Print @(40,42)CLR$(2,1)" BATTLE COMPUTER - ONLINE "
Print @(40,60)CLR$(2)" Systems energy: "energy"% "
Print @(40,75)CLR$(3)" Hull integrity: "100-damage"% "
Print @(40,90)CLR$(5)"  Shields power: "shields"% "
Print @(40,105)CLR$(6)"    Enemys left:"CLR$(4)" "enemy
Print @(30,120)CLR$(2,1)" Press"CLR$(3,1)" S "CLR$(2,1)"to set shields power"
GoSub waitkey
If a$="s" Then
  oe=energy+(Cint(shields/1.2))
  If sh=0 Then
    Print @(60,168)CLR$(4)"Shield system damage"
    Print @(60,180)CLR$(4)"shields level to 20%"
    Print @(62,192)CLR$(4)"if energy available"
    shields=20
  EndIf
  If sh=1 Then
    Print @(62,168)CLR$(3)"press 1 to 9 to set"
    Print @(62,180)CLR$(3)" shields level or "
    Print @(60,192)CLR$(3)"press X to max power"
    pupu:
    GoSub waitkey
    a1=Val(a$):If a1<1 Or a1>9 And a$<>"x" Then GoTo pupu
    If a1>0 And a1<10 Then shields=a1*10
    If a$="x" Then shields=100
  EndIf
  energy=oe-(Cint(shields/1.2))
  If energy<0 Then shields=shields-(Cint((Abs(energy)-5)/1.2)):energy=5
EndIf
Print @(74,8)CLR$(2)energy"% ":Print @(74,21)CLR$(2)shields"% "
Line(60,167)-(179,204),0,bf:Line(2,40)-(237,144),0,bf
Return

goodend:
t=KeyDown:If t<>0 Then GoTo goodend
SetTick 0,0
Line(60,167)-(179,204),0,bf
Print @(66,46,1)CLR$(0)"CONGRATULATIONS!!!"
Print @(65,45,1)CLR$(5)"CONGRATULATIONS!!!"
Print @(36,61,1)CLR$(0)"You destroyed all Arduitrons"
Print @(35,60,1)CLR$(5)"You destroyed all Arduitrons"
Print @(16,76,1)CLR$(0)"and bring back peace in the galaxy!"
Print @(15,75,1)CLR$(5)"and bring back peace in the galaxy!"
Pause 1000
Print @(55,120)CLR$(3,1)"  PRESS A KEY TO END  "
GoSub waitkey:Cls
Run "maxitrek"
End

badend:
t=KeyDown:If t<>0 Then GoTo badend
SetTick 0,0
Line(60,167)-(179,204),0,bf:Line(2,40)-(237,144),0,bf
Print @(55,45)CLR$(3)"You failed your mission"
Print @(35,60)CLR$(3)"to defeat the Arduitrons force"
Print @(65,75)CLR$(3)"and free the galaxy.."
Pause 1000
If std=>9999 Then Print @(50,90)CLR$(6)"You didn't make it in time"
If energy<=0 Then Print @(65,90)CLR$(6)"You run out of energy"
If damage=>100 Then Print @(68,90)CLR$(6)"You was destroyed !!"
Pause 1000
Print @(55,120)CLR$(3,1)"  PRESS A KEY TO END  "
GoSub waitkey:Cls
Run "maxitrek"
End

showdock:
LoadBMP "dock",2,40:Line(238,40)-(238,144),1
Print @(160,20)cndt$(3):If enemy=0 Then GoTo goodend
Return

hyperjump:
If enpr=1 Then Sprite move enty,1,220,0
Line(60,167)-(179,204),0,bf:Line(2,40)-(237,144),0,bf
Print @(25,40)CLR$(3,1)" Navigation system - JUMP DRIVE "
Print @(57,60)CLR$(2)"Current ship position"
Print @(87,74)CLR$(3)"sector "Str$(px)","Str$(py)
Print @(33,94)CLR$(5)"Alien presence in this sector"
If map(px,py)=0 Then Print @(87,108)CLR$(2)"sector free"
If map(px,py)=1 Then Print @(77,108)CLR$(4)"sector occupied"
If map(px,py)=2 Then Print @(100,108)CLR$(2)"docked"
Print @(55,130)CLR$(6,2)" Jump drive: "CLR$(7,2)"*READY* "
If nv=0 Then Print @(127,130)CLR$(6,4)"*DAMAGED*"
Print @(67,170)CLR$(7)"Insert destination"
Line(90,183)-(150,198),7,b:tx=0:ty=0
gtcoord:
a$=Inkey$
tz=Val(a$):If tz=9 Or tz=0 Then a$=""
If tz>0 And tz<9 And tx=0 Then tx=Val(a$):a$=""
If tz>0 And tz<9 And ty=0 Then ty=Val(a$)
If tx<>0 Then Print @(105,186,1)CLR$(5)Str$(tx)" ,":Pause 100
If ty<>0 Then Print @(127,186,1)CLR$(5)Str$(ty):Pause 100
If a$="" Then GoTo gtcoord
If px=tx And py=ty Then
  Pause 200:Line(60,167)-(179,204),0,bf
  Print @(75,180)CLR$(2)"Jump not needed"
  Pause 1000:Line(60,167)-(179,204),0,bf
  Line(2,40)-(237,144),0,bf:Return
EndIf
px=tx:py=ty
jumpseq:
Print @(160,20)cndt$(1)
If nv=0 Then
  px=px+Cint(Rnd(1)*2)-1:py=py+Cint(Rnd(1)*2)+1
  If px=tx And py=ty Then GoTo jumpseq
  If px=0 Then px=1
  If px=9 Then px=8
  If py=0 Then py=1
  If py=9 Then py=8
EndIf
Pause 500:Line(60,167)-(179,204),0,bf:Line(2,40)-(237,144),0,bf
Print @(90,168)CLR$(2)"Destination"
Print @(93,180)CLR$(2)" acquired"
Print @(87,192)CLR$(2)"successfully":tx=0:dock=0
Do
tx=tx+1
For ty=1 To 10:GoSub starfield:Next ty:Pause 50
Loop Until tx=15
Line(60,167)-(179,204),0,bf:dur=100:ph=0:SetTick 2,jump
Print @(63,180)CLR$(6)"Charging Hyperdrive"
Pause 1900:Line(60,167)-(179,204),0,bf
Print @(70,180)CLR$(5)"   - JUMPING -"
Pause 650:Line(60,167)-(179,204),0,bf
If nv=1 Then Print @(70,180)CLR$(2)"Jump Successfull!"
If nv=0 Then Print @(70,170)CLR$(4)"  Jump failed!"@(70,185)" Wrong position!"
Pause 1000:Line(60,167)-(179,204),0,bf
enpr=map(px,py):energy=energy-15
If enpr=2 Then dock=1:enpr=0:SetTick 0,0
If enpr=1 Then dur=100:rp=3:cx=112:cy=85:SetTick 4,alarm:GoSub initenemy
If enpr=0 Then Sprite move 7,240,85:Line(203,190)-(227,202),0,bf
Print @(160,20)cndt$(enpr+1)@(74,8)CLR$(2)energy"% "
Return

damage:
Line(60,167)-(179,204),0,bf
Print @(60,168)CLR$(4)"DAMAGES:":cl=2
If damage=>50 Then cl=6
If damage=>80 Then cl=4
Print @(110,168)CLR$(cl)" Hull "Str$(100-damage)"%"
If lr=1 And mp=1 And nv=1 And sh=1 Then Print @(90,185)CLR$(2)"NO DAMAGES"
If lr=0 Then Print @(60,180)CLR$(4)"Long Range"
If mp=0 Then Print @(138,180)CLR$(4)"Map"
If nv=0 Then Print @(60,192)CLR$(4)"Navigation"
If sh=0 Then Print @(138,192)CLR$(4)"Shields"
Return

longrange:
If enpr=1 Then Return
If lr=0 Then
  Line(60,167)-(179,204),0,bf
  Print @(63,172,1)CLR$(4)"Long range scanners"
  Print @(63,188,1)CLR$(4)"      damaged"
  Return
EndIf
Line(60,167)-(179,204),0,bf
sgx=px-1:egx=px+1:sgy=py-1:egy=py+1
If sgx=0 Then sgx=1
If egx=9 Then egx=8
If sgy=0 Then sgy=1
If egy=9 Then egy=8
For t=sgx To egx:For t1=sgy To egy
  maph(t,t1)=1
Next t1,t
For x=-1 To 1:For y=-1 To 1
sgx=px+x:sgy=py+y:a$=""
If sgx=0 Then a$=CLR$(7)+"X"
If sgx=9 Then a$=CLR$(7)+"X"
If sgy=0 Then a$=CLR$(7)+"X"
If sgy=9 Then a$=CLR$(7)+"X"
If a$="" Then
  t=map(sgx,sgy)
  If t=0 Then a$=CLR$(7)+"."
  If t=1 Then a$=CLR$(4)+"*"
  If t=2 Then a$=CLR$(2)+"o"
EndIf
Print @(75+(x*10),181+(y*10),1)a$
Next y,x
Line(72,170)-(72,200),7:Line(82,170)-(82,200),7
Line(62,180)-(92,180),7:Line(62,190)-(92,190),7
Print @(75,181,1)CLR$(3)"+"@(100,168)CLR$(6,1)" Long range "
Print @(97,182)CLR$(4)"*"CLR$(7)"Enemy "CLR$(3)"+"CLR$(7)"Ship"
Print @(97,194,1)CLR$(7)".Space "CLR$(2)"o"CLR$(7)"Planet"
Return

showmap:
If mp=0 Then
  Line(60,167)-(179,204),0,bf
  Print @(61,180,1)CLR$(4)"Map computer damaged"
  Return
EndIf
Line(2,40)-(237,144),0,bf
Print @(80,40)CLR$(6,1)"   STARMAP   "
For t=0 To 8
  Line(20,64+(10*t))-(100,64+(10*t)),7
  Line(20+(10*t),64)-(20+(10*t),144),7
  If t>0 Then Print @(7+(10*t),54,1)t:Print @(7,54+(10*t),1)t
Next t
For mx=1 To 8:For my=1 To 8
  t=map(mx,my):h=maph(mx,my)
  If t=1 And h=1 Then Print @(13+(10*mx),55+(10*my),1)CLR$(4)"*"
  If t=2 And h=1 Then Print @(13+(10*mx),54+(10*my),1)CLR$(2)"o"
  If t=0 And h=1 Then Print @(13+(10*mx),52+(10*my),1)CLR$(7)"."
Next my,mx
Print @(13+(10*px),55+(10*py),1)CLR$(3)"+"
Print @(110,64)CLR$(3)"+"CLR$(6)" - your ship"
Print @(110,76)CLR$(4)"*"CLR$(6)" - enemy force"
Print @(110,88)CLR$(2)"o"CLR$(6)" - planet"
Print @(110,98,1)CLR$(7)"."@(116,100)CLR$(6)" - free space"
Print @(110,125)CLR$(6)"your position:"CLR$(3)px","py
GoSub waitkey
Line(2,40)-(237,144),0,bf
Return

waitkey:
a$=Inkey$
If a$="" Then GoTo waitkey
Return

boom:
r=Int(Rnd(1)*dur):dur=dur-.6
PWM 20000,r,r
If dur<1 Then PWM stop:SetTick 10,engine
IReturn

laser:
r=Int(Rnd(1)*dur):dur=dur-3:dt=dt-1
PWM 21+(dur*100),dt,dt
If dur<3 Then PWM stop:SetTick 10,engine
IReturn

enemy:
dur=dur-3:fq=Int(Rnd(1)*5000)+1000
If dur<5 Then PWM stop:SetTick 10,engine:IReturn
If dt=50 Then dt=0:PWM fq,dt,dt:IReturn
If dt=0 Then dt=50:PWM fq,dt,dt:IReturn

jump:
If ph=0 Or ph=2 Then dur=dur-.1
If ph=1 Then dur=dur-1:r=Int(Rnd(1)*100)
If ph=0 Then Tone 2101-(dur*20),2101-(dur*20)
If ph=1 Then PWM 20000,r,r:PWM 40000,r,r:GoSub starfield
If ph=2 And dur>99 Then Line(90,85)-(150,95),0,bf:IReturn
If ph=2 Then
  Tone 101+(dur*20),101+(dur*20):dur=dur-.2
  Line(1+dur,40+(dur/2))-(238-dur,144-(dur/2)),0,b
EndIf
If dur<1 And ph=0 Then ph=1:dur=1500:md=0
If dur<1 And ph=1 Then ph=2:dur=100
If dur<1 And ph=2 Then Tone 40,40,10:PWM stop:SetTick 10,engine:md=1:IReturn
IReturn

shield:
dur=dur-1
Tone 100+dur,100+dur
If dur<1 Then Tone 1,1,0:PWM stop:SetTick 10,engine:IReturn
IReturn

alarm:
dur=dur-.5
If dur<1 Then rp=rp-1:dur=100
Tone 400-(dur*2),400-(dur*2)
If rp=0 Then Tone 20,20,10:SetTick 10,engine:IReturn
IReturn

engine:
std=std+.1
r=Int(Rnd(1)*10):PWM 20000,r,r:Print @(10,192)Format$(std/10,"%05.1f")
IReturn

starfield:
star=star-1:If star<1 Then star=10
If starx(star)=0 Or stary(star)=0 Then
  starx(star)=Int(Rnd(1)*40)-20:stary(star)=Int(Rnd(1)*40)-20
  starz(star)=(Int(Rnd(1)*50)/100)+0.50
EndIf
If md=1 Then Pixel(ox(star),oy(star))=0
x=(starx(star)/starz(star))+120
y=(stary(star)/starz(star))+92
If starz(star)>.3 Then cl=3 Else cl=7
If starz(star)>.6 Then cl=1
starz(star)=starz(star)-0.025
If x>2 And x<237 And y>40 And y<144 Then Pixel(x,y)=cl:ox(star)=x:oy(star)=y
If x<2 Or x>237 Or y<40 Or y>144 Then starx(star)=0:stary(star)=0
Return
